//package com.jt.service;
//
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.jt.mapper.ItemCatMapper;
//import com.jt.pojo.ItemCat;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.List;
//
//@Service
//public class ItemCatServiceImpl implements  ItemCatService{
//
//    @Autowired
//    private ItemCatMapper itemCatMapper;
//    private ItemCatMapper itemCatMapper;
//
//    /**
//     * for循环嵌套,暂时不考虑level
//     * @param level
//     * @return
//     */
//    @Override
//    public List<ItemCat> findItemCatList(Integer level) {
//    @Override
//    public List<ItemCat> findItemCatList(Integer level) {
//
//        //1.查询1级商品分类信息
//        QueryWrapper<ItemCat> queryWrapper =new QueryWrapper<>();
//        queryWrapper.eq("parent_id",0);
//        List<ItemCat> oneList = itemCatMapper .selectList(queryWrapper);
//        //2.1查询2级商品分类信息  遍历1级集合
//        for(ItemCat oneItemCat :oneList){
//            queryWrapper.clear();//清空多余的条件
//            queryWrapper.eq("parent_id", oneItemCat.getId());
//            List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
//             //2.2   查询3级商品分类信息  遍历2级集合
//            for(ItemCat twoItemCat : twoList){
//            queryWrapper.clear();
//            queryWrapper.eq("parent_id", twoItemCat.getId());
//             List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);
//             twoItemCat.setChildren(threeList);
//            }
//            //3.将二级的记录封装给一级
//            oneItemCat.setChildren(twoList);
//
//        }
//        return oneList;
//    }
//}
package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ItemCatServiceImpl implements ItemCatService{

    @Autowired
    private ItemCatMapper itemCatMapper;

    /**
     *     1.封装map集合   map<key=父级的ID,value=List<ItemCat>>
     *     2.作用:将所有的数据库的父子关系,进行封装,没有嵌套    children=null
     *     3.优势,只查询一次数据库,就可以完成父子关系的封装
     *     c策略
     *          1.key不存在,准备一个新的List集合,将自己当做集合中第一个元素
     *          2.key存在,获取与之对应的集合,  将自己追加进去
     *
     */

    public Map<Integer,List<ItemCat>> initMap(){
       Map<Integer,List<ItemCat>> map = new HashMap<>();
       List<ItemCat> itemCatList =  itemCatMapper.selectList(null);
       for(ItemCat itemCat : itemCatList){
           int key = itemCat.getParentId();
           if(map.containsKey(key)){
               List<ItemCat>list = map.get(key);
               list.add(itemCat);
           }else {
               List<ItemCat>list = new ArrayList<>();
               list.add(itemCat);
               map.put(key, list);
           }
       }

        return map;
    }

    /*
    *
    *
    * */
    @Override
    public List<ItemCat> findItemCatList(Integer level) {
        Map<Integer, List<ItemCat>> map = initMap();
        if (level==1){
        return  map.get(0);
        }if (level==2){
            return  getLevel2List(map);
        }
        List<ItemCat>list= getLevel3List(map);
        return list;

    }

    @Override
    public void updateStatus(ItemCat itemCat) {

    }

    @Override
    public void deleteItemCat(Integer id, Integer level) {
        if (level==3){
           itemCatMapper.deleteById(id);
        }
        if (level==2){
            //1.先删除3级菜单
           QueryWrapper queryWrapper= new QueryWrapper();
            queryWrapper.eq("parent_id",id);
            itemCatMapper.delete(queryWrapper);
            //2再删除2级菜单
            itemCatMapper.deleteById(id);

        }
        if(level ==1){
            List<Integer> ids =new ArrayList<>();
            //1.查询所有的二级菜单
            QueryWrapper queryWrapper= new QueryWrapper();
            queryWrapper.eq("parent_id",id);
            List<ItemCat> twoList  =itemCatMapper.selectList(queryWrapper);
            for(ItemCat twoItemCat: twoList){
            queryWrapper.clear();
            queryWrapper.eq("parentid",twoItemCat.getId());
            itemCatMapper.delete(queryWrapper);
            ids.add(twoItemCat.getId());
            }
            ids.add(id);
            itemCatMapper.deleteBatchIds(ids);
        }
    }

    public List<ItemCat> getLevel3List(Map<Integer, List<ItemCat>> map) {
        //1.先查询1-2级
        List<ItemCat> oneList = getLevel2List(map);

        //2.遍历集合
        for(ItemCat oneItemCat : oneList){
            //获取二级集合信息
            List<ItemCat> twoList = oneItemCat.getChildren();
            if(twoList == null || twoList.size() ==0){
                //当前一级菜单没有二级元素.结束本次循环,开始下一次!!!
                continue;
            }
            //该元素有二级,应该查询三级.
            for(ItemCat twoItemCat : twoList){
                List<ItemCat> threeList = map.get(twoItemCat.getId());
                twoItemCat.setChildren(threeList);
            }
        }
        return oneList;
    }


    private List<ItemCat> getLevel2List(Map<Integer, List<ItemCat>> map) {
        List<ItemCat > oneList =map.get(0);
        for (ItemCat oneItemCat : oneList){
            List<ItemCat>  twoList = map.get(oneItemCat.getId());
            oneItemCat.setChildren(twoList);
        }
        return oneList;
    }

    /**
     * 业务: 查询3级商品分类信息
     *      1. 一级中嵌套二级集合
     *      2. 二级菜单嵌套三级集合.
     *
     * 1.0版本: for循环嵌套结构  暂时不考虑level 最好理解的
     * 常识:
     *      1.用户第一次查询数据库 需要建立链接.
     *      2.第二次查询 从链接池中动态获取链接 所以速度更快!!!
     *
     *  思考: 该业务查询了多少次数据库??? 第一层循环10个  第二层循环10 总查询数=10*10=100次
     *       如何优化查询策略!!!!
     * @param level
     * @return
     */
   /* @Override
    public List<ItemCat> findItemCatList(Integer level) {
        //性能问题:!!!!!
        long startTime = System.currentTimeMillis();

        //1.查询一级商品分类信息
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", 0);
        List<ItemCat> oneList = itemCatMapper.selectList(queryWrapper);

        //2.查询二级商品分类信息  遍历一级集合
        for(ItemCat oneItemCat : oneList){
            queryWrapper.clear();   //清空条件
            queryWrapper.eq("parent_id", oneItemCat.getId());
            List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);

            //3.查询三级商品分类信息  遍历
            for(ItemCat twoItemCat : twoList){
                queryWrapper.clear();
                queryWrapper.eq("parent_id", twoItemCat.getId());
                List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);
                //将三级封装给二级
                twoItemCat.setChildren(threeList);
            }
            //3.将二级记录封装给一级
            oneItemCat.setChildren(twoList);
        }

        //记录程序的结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("查询耗时:"+(endTime - startTime)+"毫秒");
        return oneList;
    }*/
}
